package org.example.crop.util;

import cn.hutool.core.util.StrUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

/**
 * @author 李国树
 * @version 1.0
 * @Desc
 * @date 2023/4/21 15:47
 */
public class JwtUtils {
    /**
     * 秘钥
     */
    public static final String SECRET = "zjKkye4PN59B2wriTjtVCo3BOYoD1B";
    /**
     * 过期时间24小时
     */
    public static final long EXPIRE = 1000 * 60 * 60 * 24;

    /**
     * 通过payload创建令牌
     *
     * @param payload 令牌里携带的信息
     * @return token令牌
     */
    public static String createToken(Object payload) {
        String jwtToken = Jwts.builder()
                // 类型
                .setHeaderParam("typ", "JWT")
                // 算法名
                .setHeaderParam("alg", "HS256")
                // 签发时间
                .setIssuedAt(new Date())
                // 过期时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                .claim("payload", payload)
                .signWith(SignatureAlgorithm.HS256, SECRET)
                .compact();
        return jwtToken;
    }

    /**
     * 效验token
     * @param jwtToken
     * @return
     */
    public static boolean validToken(String jwtToken) {
        if (StrUtil.isEmpty(jwtToken)) {
            return false;
        }
        try {
            Jwts.parser().setSigningKey(SECRET).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 解析token
     * @param jwtToken
     * @return
     */
    public static Object parseToken(String jwtToken) {
        if (StrUtil.isEmpty(jwtToken)) {
            return null;
        }
        try {
            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(jwtToken);
            Claims claims = claimsJws.getBody();
            return claims.get("payload");
        } catch (Exception e) {
            return null;
        }
    }

}